//------------------------------------List Convert to Tree ----------------------------------------------------//
/**
 * 将list装换成tree  封装到JqueryUtils 
 * @param {Object } id    节点主ID
 * @param {Object } pId   父节点ID 
 * @param {Object } list  list数据
 * @return {Node} - 自定义Node树节点 
 * @author Jason - jasonandy@hotmail.com
 */
function listToTree(list, id = 'id', pId = 'parentId', children = 'children') {

	convertToNodeList(list);
	/**
	 * @param {} list        list
	 * @param {} pId        父节点
	 * @return {Boolean}    是否存在父节点  
	 * @description now.id = other.pid   other 的父节点为 noew
	 */
	function exists(list, pId) {
		for (var i = 0; i < list.length; i++) {
			if (list[i][id] == pId) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 树节点数据  最终数据结构
	 * @type  Node treeNode 
	 */
	var nodes = [];


	/**
	 * 将所有的节点数据装入List 
	 * @type Number
	 */
	for (var i = 0; i < list.length; i++) {
		var row = list[i];
		if (!exists(list, row[pId])) { //now.pid != new.id
			nodes.push(row); //new ids
		}
	}

	/**
	 * 父节点
	 * @type Node 
	 */
	var pNodes = [];

	/**
	 * 将所有的子节点数据装入 pNodes 
	 * @type pNodes 
	 */
	for (var i = 0; i < nodes.length; i++) {
		pNodes.push(nodes[i]);
	}


	/**
	 * 循环处理所有节点数据并进行封装 
	 */
	while (pNodes.length) {

		/**
		 *  把数组的第一个元素从其中删除，并返回第一个元素的值
		 *  the parent node
		 */
		var node = pNodes.shift();

		/**
		 * 
		 * get the children nodes
		 */
		for (var i = 0; i < list.length; i++) {
			var row = list[i];
			
			if (row[pId] == node[id]) {
				/**
				 * 如果有children 直接放入
				 */
				if (node[children]) {
					node[children].push(row);
				} else {
					node[children] = [row];
				}
				
				pNodes.push(row);
			}
		}
	}
	return nodes;
}

/**
 * Node 节点数据封装
 * @param {} list  转为map结构数据
 * @return {}      list 需要转换的list
 */
function convertToNodeList(list) {
	$.each(list, function(i, e) {
		e['root'] = e.parentId === 0;
	})
	return list;
}
//------------------------------------List Convert to Tree End----------------------------------------------------//
